{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RMS Spot Size Optimization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "from optiland import optic, optimization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define a starting lens:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens = optic.Optic()\n",
    "\n",
    "# add surfaces\n",
    "lens.add_surface(index=0, thickness=np.inf)\n",
    "lens.add_surface(index=1, thickness=7, radius=1000, material=\"N-SF11\", is_stop=True)\n",
    "lens.add_surface(index=2, thickness=30, radius=-1000)\n",
    "lens.add_surface(index=3)\n",
    "\n",
    "# set aperture\n",
    "lens.set_aperture(aperture_type=\"EPD\", value=15)\n",
    "\n",
    "# add field\n",
    "lens.set_field_type(field_type=\"angle\")\n",
    "lens.add_field(y=0)\n",
    "\n",
    "# add wavelength\n",
    "lens.add_wavelength(value=0.55, is_primary=True)\n",
    "\n",
    "# draw lens\n",
    "lens.draw(num_rays=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define optimization problem:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "problem = optimization.OptimizationProblem()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Add operands (targets for optimization):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "Define RMS spot size properties for the optimization:\n",
    "    1. Surface number = -1, implying last surface (image surface)\n",
    "    2. Normalized field coordinates (Hx, Hy) = (0, 0)\n",
    "    3. Number of rays = 5, corresponds to number of rings in hexapolar distribution\n",
    "        (see distribution documentation)\n",
    "    4. Wavelength = 0.55 µm\n",
    "    5. Pupil distribution = hexapolar\n",
    "\"\"\"\n",
    "\n",
    "input_data = {\n",
    "    \"optic\": lens,\n",
    "    \"surface_number\": -1,\n",
    "    \"Hx\": 0,\n",
    "    \"Hy\": 0,\n",
    "    \"num_rays\": 5,\n",
    "    \"wavelength\": 0.55,\n",
    "    \"distribution\": \"hexapolar\",\n",
    "}\n",
    "\n",
    "# add RMS spot size operand\n",
    "problem.add_operand(\n",
    "    operand_type=\"rms_spot_size\",\n",
    "    target=0,\n",
    "    weight=1,\n",
    "    input_data=input_data,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define variables - let radius of curvature vary for both surfaces, at surface index 1 and 2:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "problem.add_variable(lens, \"radius\", surface_number=1)\n",
    "problem.add_variable(lens, \"radius\", surface_number=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Check initial merit function value and system properties:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "╒════╤════════════════════════╤═══════════════════╕\n",
      "│    │   Merit Function Value │   Improvement (%) │\n",
      "╞════╪════════════════════════╪═══════════════════╡\n",
      "│  0 │                30.0924 │                 0 │\n",
      "╘════╧════════════════════════╧═══════════════════╛\n",
      "╒════╤════════════════╤══════════╤══════════╤═════════╤═════════╤════════════════════╕\n",
      "│    │ Operand Type   │   Target │   Weight │   Value │   Delta │   Contribution (%) │\n",
      "╞════╪════════════════╪══════════╪══════════╪═════════╪═════════╪════════════════════╡\n",
      "│  0 │ rms spot size  │        0 │        1 │ 5.48566 │ 5.48566 │                100 │\n",
      "╘════╧════════════════╧══════════╧══════════╧═════════╧═════════╧════════════════════╛\n",
      "╒════╤═════════════════╤═══════════╤═════════╤══════════════╤══════════════╕\n",
      "│    │ Variable Type   │   Surface │   Value │ Min. Bound   │ Max. Bound   │\n",
      "╞════╪═════════════════╪═══════════╪═════════╪══════════════╪══════════════╡\n",
      "│  0 │ radius          │         1 │    1000 │              │              │\n",
      "│  1 │ radius          │         2 │   -1000 │              │              │\n",
      "╘════╧═════════════════╧═══════════╧═════════╧══════════════╧══════════════╛\n"
     ]
    }
   ],
   "source": [
    "problem.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define optimizer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimizer = optimization.OptimizerGeneric(problem)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run optimization:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  message: CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH\n",
       "  success: True\n",
       "   status: 0\n",
       "      fun: 0.0023956392000377465\n",
       "        x: [-6.843e-01 -2.702e+00]\n",
       "      nit: 7\n",
       "      jac: [-1.917e-03  5.832e-04]\n",
       "     nfev: 93\n",
       "     njev: 31\n",
       " hess_inv: <2x2 LbfgsInvHessProduct with dtype=float64>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimizer.optimize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Print merit function value and system properties after optimization:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "╒════╤════════════════════════╤═══════════════════╕\n",
      "│    │   Merit Function Value │   Improvement (%) │\n",
      "╞════╪════════════════════════╪═══════════════════╡\n",
      "│  0 │             0.00239564 │            99.992 │\n",
      "╘════╧════════════════════════╧═══════════════════╛\n",
      "╒════╤════════════════╤══════════╤══════════╤═══════════╤═══════════╤════════════════════╕\n",
      "│    │ Operand Type   │   Target │   Weight │     Value │     Delta │   Contribution (%) │\n",
      "╞════╪════════════════╪══════════╪══════════╪═══════════╪═══════════╪════════════════════╡\n",
      "│  0 │ rms spot size  │        0 │        1 │ 0.0489453 │ 0.0489453 │                100 │\n",
      "╘════╧════════════════╧══════════╧══════════╧═══════════╧═══════════╧════════════════════╛\n",
      "╒════╤═════════════════╤═══════════╤═══════════╤══════════════╤══════════════╕\n",
      "│    │ Variable Type   │   Surface │     Value │ Min. Bound   │ Max. Bound   │\n",
      "╞════╪═════════════════╪═══════════╪═══════════╪══════════════╪══════════════╡\n",
      "│  0 │ radius          │         1 │   31.5704 │              │              │\n",
      "│  1 │ radius          │         2 │ -170.224  │              │              │\n",
      "╘════╧═════════════════╧═══════════╧═══════════╧══════════════╧══════════════╛\n"
     ]
    }
   ],
   "source": [
    "problem.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Draw final lens:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens.draw(num_rays=5)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
